package pe.edu.upc.dsd.jjjar.upcbank.client.mvc.layouts;

import java.util.ArrayList;
import java.util.List;

import pe.edu.upc.dsd.jjjar.upcbank.client.AfiliacionServiceAsync;
import pe.edu.upc.dsd.jjjar.upcbank.client.AfiliacionView;
import pe.edu.upc.dsd.jjjar.upcbank.client.BancoUPC;
import pe.edu.upc.dsd.jjjar.upcbank.client.mvc.SearchGrid;
import pe.edu.upc.dsd.jjjar.upcbank.resources.client.Resources;
import pe.edu.upc.dsd.jjjar.upcbank.resources.client.model.Afiliacion;
import pe.edu.upc.dsd.jjjar.upcbank.resources.client.model.Operation;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class AfiliacionesList extends SearchGrid<Afiliacion>{


	private AfiliacionView view;
	private final AfiliacionServiceAsync service = 
		(AfiliacionServiceAsync) Registry.get(BancoUPC.AFILIACION_SERVICE);
	
	public AfiliacionesList(AfiliacionView view) {
		this.view = view;
	}	
	
	private AsyncCallback<Operation> deleteCallback = new AsyncCallback<Operation>() {

		@Override
		public void onFailure(Throwable caught) {}

		@Override
		public void onSuccess(Operation result) {
			if(!result.isSuccess())
				MessageBox.info("Eliminar", result.getMessage(), null);
			refresh();
		}
		
		
	};
	
	@Override
	public List<ColumnConfig> createColumnConfig() {
		
		
		List<ColumnConfig> configs = new ArrayList<ColumnConfig>();  
		  
	    ColumnConfig column = new ColumnConfig();  
	    column.setHeader("Nro Cuenta");  
	    column.setRenderer(new GridCellRenderer<Afiliacion>() {

			@Override
			public Object render(Afiliacion model, String property,
					ColumnData config, int rowIndex, int colIndex,
					ListStore<Afiliacion> store, Grid<Afiliacion> grid) {
				
				GWT.log( model.getCuenta().getNrocta());
				return model.getCuenta().getNrocta();
			}
		});
	    column.setWidth(50);  
	    configs.add(column); 
	    
	    column = new ColumnConfig();   
	    column.setHeader("Tipo Cuenta");
	    column.setRenderer(new GridCellRenderer<Afiliacion>() {

			@Override
			public Object render(Afiliacion model, String property,
					ColumnData config, int rowIndex, int colIndex,
					ListStore<Afiliacion> store, Grid<Afiliacion> grid) {
				GWT.log( model.getCuenta().getTypcta());
				return model.getCuenta().getTypcta();
			}
		});
	    column.setWidth(50);  
	    configs.add(column);  
	  
	    column = new ColumnConfig();  
	    column.setId(Afiliacion.CELULAR);  
	    column.setHeader("Celular");   
	    column.setWidth(150);  
	    configs.add(column); 
	  
	    column = new ColumnConfig();  
	    column.setId(Afiliacion.FRASE);  
	    column.setHeader("Frase");
	    column.setWidth(100);
	    configs.add(column);  
	    
	    column = new ColumnConfig();   
	    column.setHeader("Monto");
	    column.setRenderer(new GridCellRenderer<Afiliacion>() {
			public String render(Afiliacion model, String property, ColumnData config, 
					int rowIndex, int colIndex, ListStore<Afiliacion> store, Grid<Afiliacion> grid) {

				NumberFormat currency = NumberFormat.getCurrencyFormat( model.getCuenta().getMoneda() );
				return currency.format(model.getCuenta().getMonto());
				
			}
		});
	    column.setWidth(50);  
	    configs.add(column);  
	    
	    
	    
	    return configs;
	}

	@Override
	public ToolBar createToolbar() {
		ToolBar toolBar = new ToolBar();  
	    toolBar.getAriaSupport().setLabel("Grid Options");
	    toolBar.add(new LabelToolItem("Afiliaciones del Metropolitano"));
	    toolBar.add(new SeparatorToolItem());
		toolBar.add(new Button("Nuevo", Resources.ICONS.add(), new SelectionListener<ButtonEvent>() {
			
			@Override
			public void componentSelected(ButtonEvent ce) {
				view.initNew();
			}
		}));  
	    toolBar.add(new Button("Eliminar", Resources.ICONS.delete(), new SelectionListener<ButtonEvent>() {
			
			@Override
			public void componentSelected(ButtonEvent ce) {
				
				int size = getGrid().getSelectionModel().getSelectedItems().size();
				
				if(size==0){
					MessageBox.info("Eliminar", "Debe seleccionar un registro de la lista", null);
				}else{
					
					if(size==1)
		
						MessageBox.confirm("Eliminar", "Est&aacute; seguro de eliminar el registro seleccionado?", new Listener<MessageBoxEvent>() {
						
						@Override
						public void handleEvent(MessageBoxEvent be) {
							if( be.getButtonClicked().getItemId().equals( Dialog.YES ) )
								service.delete(getGrid().getSelectionModel().getSelectedItem(), deleteCallback);
						}
						});
					
					else{


						MessageBox.info("Eliminar", "Debe seleccionar un solo registro de la lista", null);
					}
					
						
					
					
				}
				
				
			}
		}));  
	    
		return toolBar;
	}
	

	

	@Override
	public void loadData(Object loadConfig,
			AsyncCallback<PagingLoadResult<Afiliacion>> callback) {
		service.getAfiliaciones((PagingLoadConfig) loadConfig, callback);
	}

	@Override
	public void configGrid(Grid<Afiliacion> grid) {

	}


}
